package netWork;

import javax.xml.crypto.Data;
import java.io.IOException;
import java.net.*;
import java.sql.SQLOutput;

public class UdpServer {
    //创建一个DatagramSocket对象，是后续进行网卡的基础
    private DatagramSocket socket = null;

    public UdpServer(int port)  throws SocketException{
        //下面是手动指定端口
        socket = new DatagramSocket(port);

        //下面这么写就是系统自动分配端口
        //socket = new DatagramSocket();
    }

    //程序的主方法,通过这个方法来启动服务器
    public void start() throws IOException {
        System.out.println("服务器启动");
        //一个服务器要不停滴运行，所以需要一个while循环来进行操作,一个服务器程序是要长时间运行的
        //为了保证客户端随时来，随时可以响应，
        while(true){
            //1.第一步，读取请求并解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4090],4090);
            socket.receive(requestPacket);
            //将请求转化为字符串
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());

            //2.根据请求计算响应
            //这个步骤是服务器最核心的一个步骤,
            String response = process(request);


            //3. 把响应返回给客户端
            //使用一个响应对象  DatagramPacket  往响应对象中构造刚才的数据，再通过send返回
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());

            socket.send(responsePacket);


            System.out.printf("[%s:%d] req = %s,resp = %s\n",requestPacket.getAddress().toString(),
                    requestPacket.getPort(),request,response);

        }
    }

    public String process(String request){
        return request;
    }

    public static void main(String[] args) throws IOException {
        UdpServer server = new UdpServer(9090);
        server.start();
    }
}
